Route53でリージョン別APIのDNS設定をする
はじめに
サーバーレス開発部の岡です。
今回、Route53で管理しているドメインでAPI Gatewayのカスタムドメインを設定しました。 が、エンドポイントタイプをRegionalに設定している場合に、Route53のコンソール上でAレコードを追加しようとするとエラーが出てしまいます。
公式ドキュメントを見てみると、Regional APIの場合はAliasの追加を
AWS CLI
またはAWS SDK for Route 53
で行う必要があるようです。
Route 53 マネジメントコンソールを使用して、エッジ最適化カスタムドメイン名の DNS レコードをセットアップすることもできますが、リージョン別カスタムドメイン名の場合はできません。
分かってしまえば手順は簡単なのですが、エラー内容から公式ドキュメントまでなかなかたどり着けなかったため、今回手順をご紹介したいと思います。
詳細
エンドポイントタイプとは
現在(2018/08/13)API Gatewayがサポートしているエンドポイントタイプは以下の3つになります。
- エッジ最適化(Edge optimized)・・・CloudFrontディストリビューションからのアクセス
- プライベート(Private)・・・パブリックインターネットから分離され、許可されたVPCからのアクセスのみ
- 地域(Regional)・・・APIと同じリージョンから発信される場合に、リクエストのレイテンシーを減らすことができる
コンソールで実行した場合のエラー
ちなみに、Route53コンソールで実行した場合、以下のエラーとなります。
The record set could not be saved because: - Alias Target contains an invalid value.
実際の手順
手順についてはこちらの記事と同じになります。
最後の方のRoute53でDNSの設定
の所のみをCLIで実行しないといけません。
ACMでパブリック証明書の作成
上記事のCertficate ManagerでSSLを取得する
と同手順
API Gatewayでカスタムドメインを設定
上記事のAPI Gatewayでカスタムドメインを設定する
と同手順
ちなみにCLIで実行する場合は、
aws apigateway create-domain-name \ --domain-name 'regional.example.com' \ --endpoint-configuration types=REGIONAL \ --regional-certificate-arn 'arn:aws:acm:us-west-2:123456789012:certificate/c19332f0-3be6-457f-a244-e03a423084e6'
成功すると以下のようなレスポンスが返ってきます。
{ "certificateUploadDate": "2017-10-13T23:02:54Z", "domainName": "regional.example.com", "endpointConfiguration": { "types": "REGIONAL" }, "regionalCertificateArn": "arn:aws:acm:us-west-2:123456789012:certificate/c19332f0-3be6-457f-a244-e03a423084e6", "regionalDomainName": "d-numh1z56v6.execute-api.us-west-2.amazonaws.com" }
DNS設定(CLIで実行)
ここが本筋です! AWS CLIでRoute53のドメインとAPI Gateway上に作成したカスタムドメイン名マッピングするためのAレコード(Alias)を追加していきます。
JSONファイルを作成
API Gatewayで作成したカスタムドメイン名のエンドポイントの設定を入力していきます。
{ "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "regional.example.com", "Type": "A", "AliasTarget": { "DNSName": "d-numh1z56v6.execute-api.us-west-2.amazonaws.com", "HostedZoneId": "Z5TEXXXXXXXXXX", "EvaluateTargetHealth": false } } } ] }
- "Name"・・・設定したいドメイン
- "DNSName"・・・ターゲットドメイン名(regionalDomainName)
- "HostedZoneId"・・・API GatewayのホストゾーンID(regionalHostedZoneId)
ちなみに、ホストゾーンIDは以下のドキュメントからも参照できます。 https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#apigateway_region
コマンドを実行
aws route53 change-resource-record-sets \ --hosted-zone-id ZPPXXXXXXX \ --change-batch file://path/to/your/setup-dns-record.json
- --hosted-zone-id・・・Route53のドメインに紐づいたホストゾーンID
- --change-batch file://・・・上の手順で作成したJSONファイル名
実行するとステータスを含んだレスポンスがJSON形式で返ってきます。
まとめ
いかがでしたでしょうか。 Route53を使えばAWSのサービス上で簡単にDNSの設定ができる一方、思わぬ制限がありました。 カスタムドメイン名のマッピングする際に出たエラーメッセージから公式ドキュメントに結びつかず時間を要してしまったので、備忘録もかねて記事にしました。
API Gatewayのドメイン設定をする人はアプリ開発者の人も多いかと思うので、 ドメイン設定等、アプリ開発の本筋でない所には上手くAWSサービスを活用してなるべくスムーズにできればと思います。